<?xml version="1.0" encoding="UTF-8"?>
<AnyLogicWorkspace WorkspaceVersion="1.8" AnyLogicVersion="5.5.0.779" AnimatedPlay="0">
<Projects>
<Item Name="Flocks of Agents" Expanded="y">
<Compatibility GenerateGetThis="n" DontGenerateToString="n" DontGenerateClone="n" GenerateGetOwnerForTimer="n"/>
<OCLOptions/>
<HLA/>
<Packages>
<Item Name="flocks_of_agents" Expanded="y">
<ActiveObjectClasses>
<Item Name="Agent" Expanded="y">
<AdditionalClassCode><![CDATA[


]]></AdditionalClassCode>
<AlgorithmicFunctions>
<Item Name="avoidCollision" Type="void">
<Body><![CDATA[
// applied only if there are no enemies around, but some friends too close to me
Agent b = nearestFriend;

if ( b == null )
  return;
turnAway( b.x, b.y );
double dx = b.x - x;
double dy = b.y - y;
if ( cos( heading ) * cos( b.heading ) + sin( heading ) * sin( b.heading ) > 0 ) { // same direction
  if( dx * cos( heading ) + dy * sin( heading ) < 0 ) { // this agent is behind the other
    slowDown();
  } else { // this agent is in front of the other
    speedUp();                          
  }
} else { // going opposite directions
  if( dx * cos( heading ) + dy * sin( heading ) < 0 ) { // head-on collision course
    slowDown();
  }
}

]]></Body></Item>
<Item Name="avoidWalls" Type="void">
<Body><![CDATA[
//avoid collision with walls
double dxr = width - x;
double dyd = height - y;

if( cos( heading ) > 0 ) { //going right
  if( sin( heading ) < 0 ) { //going up-right
    if( dxr < sensorRange ) { //right wall 
      slowDown();
      for( int i=0; i<1+(int)(sensorRange/dxr); i++ ) turnLeft(); 
    } else if( y < sensorRange ) { //upper wall 
      slowDown();
      for( int i=0; i<1+(int)(sensorRange/y); i++ ) turnRight(); 
    } 
  } else { //going down-right
    if( dxr < sensorRange ) { //right wall 
      slowDown();
      for( int i=0; i<1+(int)(sensorRange/dxr); i++ ) turnRight(); 
    } else if( dyd < sensorRange ) { //down wall 
      slowDown();
      for( int i=0; i<1+(int)(sensorRange/dyd); i++ ) turnLeft(); 
    }
  }
} else { //going left
  if( sin( heading ) < 0 ) { //going up-left
    if( x < sensorRange ) { //left wall 
      slowDown();
      for( int i=0; i<1+(int)(sensorRange/x); i++ ) turnRight(); 
    } else if( y < sensorRange ) { //upper wall 
      slowDown();
      for( int i=0; i<1+(int)(sensorRange/y); i++ ) turnLeft(); 
    } 
  } else { //going down-left
    if( x < sensorRange ) { //left wall 
      slowDown();
      for( int i=0; i<1+(int)(sensorRange/x); i++ ) turnLeft(); 
    } else if( dyd < sensorRange ) { //down wall 
      slowDown();
      for( int i=0; i<1+(int)(sensorRange/dyd); i++ ) turnRight(); 
    } 
  }
}

]]></Body></Item>
<Item Name="decide" Type="void">
<Body><![CDATA[
// this is where the agent decides what to do based on what it senses
if ( nearestFriend != null ) { // some friends too close to me
    avoidCollision();
  } else { // no friend too close
    hangOutWithFriends();
  }
// avoid walls no matter what 
avoidWalls(); // NB!!! here is the possibility to accel or turn twice or more in one step!!!



]]></Body></Item>
<Item Name="hangOutWithFriends" Type="void">
<Body><![CDATA[
// applied only if no enemies around and no friend too close
if ( friendsNumber > 0 ) { // if there are some friends around

  turnToward( friendsX, friendsY );  
  if ( friendsSpeed > speed ) {
    speedUp();
  } else if ( friendsSpeed < speed ) {
    slowDown();
  }

} else { // no one around

  slowDown();
  if ( uniform() < 0.5 ) // do random turns
    turnLeft();
  else
    turnRight();

}

]]></Body></Item>
<Item Name="isFriend" Type="boolean">
<Body><![CDATA[
return color.equals( b.color );

]]></Body>
<Arguments>
<Argument Name="b" Type="Agent"/>
</Arguments></Item>
<Item Name="isInRange" Type="boolean">
<Body><![CDATA[
double dx = b.x - x;
double dy = b.y - y;
return dx * dx + dy * dy < range * range;

]]></Body>
<Arguments>
<Argument Name="b" Type="Agent"/>
<Argument Name="range" Type="real"/>
</Arguments></Item>
<Item Name="move" Type="void">
<Body><![CDATA[
x += speed * dt * Math.cos( heading );
y += speed * dt * Math.sin( heading ); 
// agents are avoiding walls, but just in case they can't
// the 2D space is made a torus
if ( x > width )
  x -= width;
else if ( x < 0 )
  x += width;
if ( y > height )
  y -= height;
else if ( y < 0 )
  y += height;
// add current position to trace - just for animation
for ( int i = traceX.length - 1; i > 0; i-- ) {

  traceX[i] = traceX[i-1];
  traceY[i] = traceY[i-1];

}
traceX[0] = x;
traceY[0] = y;

]]></Body></Item>
<Item Name="senseFlock" Type="void">
<Body><![CDATA[
friendsNumber = 0;
double totalFriendsX       = 0.0;
double totalFriendsY       = 0.0;
double totalFriendsSpeed   = 0.0;
double totalFriendsHeading = 0.0;

nearestFriend = null;
double distanceToFriend = collisionRange;

for ( int i = 0; i < flock.agents.size(); i++ ) {

  Agent b = flock.agents.item( i );

  if ( isFriend( b ) ) { // if a friend

    //check if this agent is the nearest one
    if ( isInRange( b, distanceToFriend ) ) { 

      nearestFriend = b;
      distanceToFriend = Math.sqrt( (b.x - x) * (b.x - x) + (b.y - y) * (b.y - y) ); // !!!OPT

    } 
    // prepare to calc geomerty means of friends
    if ( isInRange( b, sensorRange ) ) { 

      friendsNumber++;
      totalFriendsX += b.x;
      totalFriendsY += b.y;
      totalFriendsSpeed   += b.speed;
      totalFriendsHeading += b.heading;

    }
  } 

}

// calculate the means for friends
if ( friendsNumber == 0 ) { // if no friends around, means equals to mine 

  friendsHeading = heading;
  friendsSpeed   = speed;
  friendsX = x;
  friendsY = y;

} else { // otherwise, calc the means

  friendsHeading = totalFriendsHeading / friendsNumber;
  friendsSpeed   = totalFriendsSpeed / friendsNumber;
  friendsX = totalFriendsX / friendsNumber;
  friendsY = totalFriendsY / friendsNumber;

}




]]></Body></Item>
<Item Name="slowDown" Type="void">
<Body><![CDATA[
speed = limitMin( minimumSpeed, speed - acceleration * dt );

]]></Body></Item>
<Item Name="speedUp" Type="void">
<Body><![CDATA[
speed = limitMax( speed + acceleration * dt, maximumSpeed );

]]></Body></Item>
<Item Name="step" Type="void">
<Body><![CDATA[
senseFlock();
decide();
move();

]]></Body></Item>
<Item Name="turnAway" Type="void">
<Body><![CDATA[
double dx = xPos - x;
double dy = yPos - y;

if ( cos( heading ) * dy - sin( heading ) * dx > 0 )
  turnLeft();
else
  turnRight();

]]></Body>
<Arguments>
<Argument Name="xPos" Type="real"/>
<Argument Name="yPos" Type="real"/>
</Arguments></Item>
<Item Name="turnLeft" Type="void">
<Body><![CDATA[
heading = ( heading - turnAngle * dt ) % ( 2 * Math.PI );

]]></Body></Item>
<Item Name="turnRight" Type="void">
<Body><![CDATA[
heading = ( heading + turnAngle * dt ) % ( 2 * Math.PI );

]]></Body></Item>
<Item Name="turnToward" Type="void">
<Body><![CDATA[
double dx = xPos - x;
double dy = yPos - y;

if ( cos( heading ) * dy - sin( heading ) * dx < 0 )
  turnLeft();
else
  turnRight();

]]></Body>
<Arguments>
<Argument Name="xPos" Type="real"/>
<Argument Name="yPos" Type="real"/>
</Arguments></Item>
</AlgorithmicFunctions>
<StructureDiagram>
<Variable ID="26" Name="flock" Pos="120 40" NamePos="140 40">
<VarType ScalarType="Flock"/>
<Value><![CDATA[(Flock)getOwner()]]></Value>
<Equation/></Variable>
<Variable ID="25" Name="traceY" Pos="220 340" NamePos="240 340">
<VarType ScalarType="double[]"/>
<Value><![CDATA[new double[10];]]></Value>
<Equation/></Variable>
<Variable ID="24" Name="traceX" Pos="220 320" NamePos="240 320">
<VarType ScalarType="double[]"/>
<Value><![CDATA[new double[10];]]></Value>
<Equation/></Variable>
<Variable ID="21" Name="nearestFriend" Pos="220 100" NamePos="240 100">
<VarType ScalarType="Agent"/>
<Equation/></Variable>
<Variable ID="15" Name="friendsSpeed" Pos="350 80" NamePos="370 80">
<VarType ScalarType="real"/>
<Equation/></Variable>
<Variable ID="16" Name="friendsHeading" Pos="350 60" NamePos="370 60">
<VarType ScalarType="real"/>
<Equation/></Variable>
<Variable ID="14" Name="friendsNumber" Pos="220 40" NamePos="240 40">
<VarType ScalarType="integer"/>
<Equation/></Variable>
<Variable ID="7" Name="friendsY" Pos="220 80" NamePos="240 80">
<VarType ScalarType="real"/>
<Equation/></Variable>
<Variable ID="6" Name="friendsX" Pos="220 60" NamePos="240 60">
<VarType ScalarType="real"/>
<Equation/></Variable>
<Variable ID="5" Name="y" Pos="120 130" NamePos="140 128.5">
<VarType ScalarType="real"/>
<Value><![CDATA[initY]]></Value>
<Equation/></Variable>
<Variable ID="4" Name="x" Pos="120 110" NamePos="140 108.5">
<VarType ScalarType="real"/>
<Value><![CDATA[initX]]></Value>
<Equation/></Variable>
<Variable ID="3" Name="speed" Pos="120 90" NamePos="140 88.5">
<VarType ScalarType="real"/>
<Value><![CDATA[initSpeed]]></Value>
<Equation/></Variable>
<Variable ID="2" Name="heading" Pos="120 70" NamePos="140 70">
<VarType ScalarType="real"/>
<Value><![CDATA[initHeading]]></Value>
<Equation/></Variable>
<Bounds Flags="0" Pen="#808080 20" Brush="#000000" ID="1" Name="Agent" Rect="90 0 500 360" NamePos="90 -20"/>
<Comment ID="23" Name="textBox1" Rect="200 0 500 140">
<Text><![CDATA[These are setup and used within one step]]></Text></Comment>
<Comment ID="10" Name="textBox" Rect="200 280 500 360">
<Text><![CDATA[These are just for animation]]></Text></Comment>
</StructureDiagram>
<StartupCode><![CDATA[
// initialize trace - again just for animation
for ( int i = 0; i > traceX.length; i++ ) {

  traceX[i] = x;
  traceY[i] = y;

}
]]></StartupCode><Image/>
<Parameters>
<Item Name="dt" DefaultValue="1"/>
<Item Name="width" DefaultValue="500"/>
<Item Name="height" DefaultValue="500"/>
<Item Name="maximumSpeed" DefaultValue="10"/>
<Item Name="minimumSpeed" DefaultValue="1"/>
<Item Name="turnAngle" DefaultValue="0.5"/>
<Item Name="acceleration" DefaultValue="0.01"/>
<Item Name="sensorRange" DefaultValue="50"/>
<Item Name="collisionRange" DefaultValue="5"/>
<Item Name="color" Type="Color" DefaultValue="Color.green"/>
<Item Name="initHeading" DefaultValue="uniform() * 2 * Math.PI"/>
<Item Name="initSpeed" DefaultValue="uniform( minimumSpeed, maximumSpeed )"/>
<Item Name="initX" DefaultValue="uniform() * width"/>
<Item Name="initY" DefaultValue="uniform() * height"/>
</Parameters></Item>
<Item Name="Flock" Expanded="y">
<AdditionalClassCode><![CDATA[
// team colors
Color colorBlue   = new Color( 0, 204, 255 );
Color colorRed    = Color.red;
Color colorGreen  = Color.green;
Color colorYellow = new Color( 255, 204, 0 );


]]></AdditionalClassCode>
<Animations>
<Item Name="animation" Expanded="y">
<AnimationDiagram>
<Area ID="1" Rect="-415 -25 525 545" BackgroundImageFileName="sky.JPG" BackgroundImageLayout="0"/>
<Button Flags="6" Brush="#008000" ID="36" Name="button" Rect="480 500 495 515" Font="Tahoma,12">
<EventHandlingCode><![CDATA[createTeam( colorGreen, 0, width/8, 0, height/8, Math.PI/4 );]]></EventHandlingCode></Button>
<Slider Flags="6" Pen="no 0" Brush="no" ID="30" Name="slider3" Rect="-380 160 -250 180" VariableName="turnAngle" Font="Tahoma,12" Label="slider" MinValue="0.03" MaxValue="0.3"/>
<Slider Flags="6" Pen="no 0" Brush="no" ID="31" Name="slider4" Rect="-380 210 -250 230" VariableName="acceleration" Font="Tahoma,12" Label="slider" MinValue="0.02" MaxValue="0.1"/>
<Slider Flags="6" Pen="no 0" Brush="no" ID="32" Name="slider5" Rect="-380 260 -250 280" VariableName="maximumSpeed" Font="Tahoma,12" Label="slider" MinValue="5" MaxValue="20"/>
<Slider Flags="6" Pen="no 0" Brush="no" ID="7" Name="slider1" Rect="-380 105 -250 125" VariableName="collisionRange" Font="Tahoma,12" Label="slider" MinValue="2" MaxValue="15"/>
<Slider Flags="6" Pen="no 0" Brush="no" ID="5" Name="slider" Rect="-380 55 -250 75" VariableName="sensorRange" Font="Tahoma,12" Label="slider" MinValue="20" MaxValue="100"/>
<Oval ID="106" Name="obs3" Rect="240 140 260 160" Brush="#000080"/>
<Oval ID="105" Name="obs2" Rect="230 210 250 230" Brush="#ffff00"/>
<Oval ID="101" Name="obs1" Rect="180 170 200 190" Brush="#800000"/>
<Rectangle Flags="0" Pen="#333333 10" Brush="no" ID="95" Name="rectangle1" Rect="-10 -10 500 500" Height="height + 10" Width="width + 10"/>
<PolyLine ID="94" Name="polyLine" Replication="agents.size()" PosX="agents.item( index).x" PosY="agents.item( index).y" FillColor="agents.item( index).color" Rotation="agents.item( index).heading" Brush="#008000" Points="205 125 210 135 215 125 205 125 210 135"/>
<Text ID="64" Name="text23" Rect="-280 140 -258.6 155" Flags="28680" Pen="no 0" Brush="#00ff00" Font="Tahoma,11">
<Text><![CDATA[123]]></Text>
<TextExpr><![CDATA[turnAngle]]></TextExpr></Text>
<Text ID="63" Name="text22" Rect="-280 190 -258.6 205" Flags="28680" Pen="no 0" Brush="#00ff00" Font="Tahoma,11">
<Text><![CDATA[123]]></Text>
<TextExpr><![CDATA[acceleration]]></TextExpr></Text>
<Text ID="62" Name="text21" Rect="-270 240 -248.6 255" Flags="28680" Pen="no 0" Brush="#00ff00" Font="Tahoma,11">
<Text><![CDATA[123]]></Text>
<TextExpr><![CDATA[maximumSpeed]]></TextExpr></Text>
<Text ID="60" Name="text19" Rect="-280 85 -258.6 100" Flags="28680" Pen="no 0" Brush="#00ff00" Font="Tahoma,11">
<Text><![CDATA[123]]></Text>
<TextExpr><![CDATA[(int)collisionRange]]></TextExpr></Text>
<Text ID="59" Name="text18" Rect="-280 40 -258.6 55" Flags="28680" Pen="no 0" Brush="#00ff00" Font="Tahoma,11">
<Text><![CDATA[123]]></Text>
<TextExpr><![CDATA[(int)sensorRange]]></TextExpr></Text>
<Text ID="52" Name="text14" Rect="500 480 519.5 492.3" Flags="28680" Pen="no 0" Brush="#008000" Font="Tahoma,9">
<Text><![CDATA[+10]]></Text></Text>
<Text ID="51" Name="text13" Rect="-390 -10 -179.8 22.8" Flags="28680" Pen="no 0" Brush="#800000" Font="Tahoma,24,B">
<Text><![CDATA[Flock of Agents]]></Text></Text>
<Text ID="33" Name="text7" Rect="-370 140 -304.3 155" Flags="28680" Pen="no 0" Brush="#000000" Font="Tahoma,11">
<Text><![CDATA[Turn Angle:]]></Text></Text>
<Text ID="34" Name="text8" Rect="-370 190 -297.9 205" Flags="28680" Pen="no 0" Brush="#000000" Font="Tahoma,11">
<Text><![CDATA[Acceleration:]]></Text></Text>
<Text ID="35" Name="text9" Rect="-370 240 -273.8 255" Flags="28680" Pen="no 0" Brush="#000000" Font="Tahoma,11">
<Text><![CDATA[Maximum Speed:]]></Text></Text>
<Text ID="26" Name="text3" Rect="440 500 468.2 521.8" Flags="28680" Pen="no 0" Brush="#008000" Font="Tahoma,16,B" TextColorExpr="colorGreen">
<Text><![CDATA[#B]]></Text></Text>
<Oval ID="18" Name="oval2" Rect="-400 330 -200 530" Flags="0" Pen="#3366ff 10" Brush="no" Radius1Expr="sensorRange" Radius2Expr="sensorRange"/>
<Oval ID="15" Name="oval" Rect="-312.5 417.8 -287.5 442.3" Flags="0" Pen="#ffcc00 10" Brush="no" Radius1Expr="collisionRange" Radius2Expr="collisionRange"/>
<PolyLine ID="14" Name="polyLine1" Pen="no 10" Brush="#00ff00" Points="-300 420 -303 428 -297 428"/>
<Line ID="20" Name="line1" Flags="0" Pen="#333333 10" Points="-300 330 -300 530"/>
<Line ID="19" Name="line" Flags="0" Pen="#333333 10" Points="-400 430 -200 430"/>
<Text ID="8" Name="text1" Rect="-370 85 -281.1 100" Flags="28680" Pen="no 0" Brush="#000000" Font="Tahoma,11">
<Text><![CDATA[Collision Range:]]></Text></Text>
<Text ID="6" Name="text" Rect="-370 35 -288.8 50" Flags="28680" Pen="no 0" Brush="#000000" Font="Tahoma,11">
<Text><![CDATA[Sensor Range:]]></Text></Text>
<Rectangle Flags="0" Brush="no" ID="2" Name="rectangle" Rect="-10 -10 500 500" Height="height" Width="width"/>
<Rectangle Pen="#171717 10" Brush="#171717" ID="23" Name="rectangle2" Rect="-400 330 -200 530"/>
</AnimationDiagram></Item>
</Animations>
<AlgorithmicFunctions>
<Item Name="createTeam" Type="void">
<Body><![CDATA[
Obstacle obs1 = new Obstacle();
obs1.dt = dt;
obs1.width = 20;
obs1.height = 20;
obs1.color = Color.red;
obs1.initX = 180;
obs1.initY = 160;

Obstacle obs2 = new Obstacle();
obs2.dt = dt;
obs2.width = 20;
obs2.height = 20;
obs2.color = Color.blue;
obs2.initX = 251;
obs2.initY = 255;

Obstacle obs3 = new Obstacle();
obs3.dt = dt;
obs3.width = 20;
obs3.height = 20;
obs3.color = Color.yellow;
obs3.initX = 270;
obs3.initY = 198;

for ( int i = 0; i < teamSize; i++ ) {

  Agent b = new Agent();
  //setup common parameters
  //NB: this we have to do manually because of dynamic creation
  b.dt              = dt;
  b.width           = width;
  b.height          = height;
  b.maximumSpeed    = maximumSpeed;
  b.acceleration    = acceleration;
  b.turnAngle       = turnAngle;
  b.sensorRange     = sensorRange;
  b.collisionRange  = collisionRange;
  //setup team color
  b.color           = color;
  //setup initial position, speed, heading
  b.initX           = uniform( minX, minX + w );
  b.initY           = uniform( minY, minY + h );
  b.initHeading     = meanHeadig + ( -Math.PI / 8 + uniform( Math.PI / 4 ) );
  //add to the system
  setup_agents( b, 0 );

}

]]></Body>
<Arguments>
<Argument Name="color" Type="Color"/>
<Argument Name="minX" Type="real"/>
<Argument Name="w" Type="real"/>
<Argument Name="minY" Type="real"/>
<Argument Name="h" Type="real"/>
<Argument Name="meanHeadig" Type="real"/>
</Arguments></Item>
</AlgorithmicFunctions>
<StructureDiagram>
<ChartTimer ID="3" Name="stepTimer" Pos="130 130" NamePos="150 130" Type="2" Timeout="dt">
<ExpiryAction><![CDATA[
for ( int i = 0; i < agents.size(); i++ )
  agents.item( i ).step();

]]></ExpiryAction></ChartTimer>
<Object OriginOffset="30.5 20.5" Flags="10" ID="2" Name="agents" Pos="150 80" NamePos="119.5 49.5" ReplicationFactor="0" Type="flocks_of_agents.Agent">
<Parameters>
<Item Name="maximumSpeed" Value="maximumSpeed"/>
<Item Name="minimumSpeed" Value="minimumSpeed"/>
<Item Name="turnAngle" Value="turnAngle"/>
<Item Name="acceleration" Value="acceleration"/>
<Item Name="sensorRange" Value="sensorRange"/>
<Item Name="collisionRange" Value="collisionRange"/>
<Item Name="color"/>
<Item Name="dt" Value="dt"/>
<Item Name="width" Value="width"/>
<Item Name="height" Value="height"/>
</Parameters></Object>
<Object OriginOffset="30.5 20.5" Flags="10" ID="5" Name="obstacle" Pos="50 100" NamePos="18.5 68.5" Type="flocks_of_agents.Obstacle"/>
<Bounds Flags="1" Pen="#808080 20" Brush="#000000" ID="1" Name="Flock" Rect="0 0 400 200" NamePos="10 10"/>
</StructureDiagram>
<StartupCode><![CDATA[
//createTeam( colorBlue,   0,             width / 8, 0,              height / 8, Math.PI / 4      );
//createTeam( colorRed,    width * 7 / 8, width / 8, 0,              height / 8, Math.PI * 3 / 4  );
createTeam( colorGreen,  width * 7 / 8, width / 8, height * 7 / 8, height / 8, -Math.PI * 3 / 4 );
//createTeam( colorYellow, 0,             width / 8, height * 7 / 8, height / 8, -Math.PI / 4     );
]]></StartupCode><Image/>
<Parameters>
<Item Name="dt" DefaultValue="1"/>
<Item Name="height" DefaultValue="500"/>
<Item Name="width" DefaultValue="500"/>
<Item Name="teamSize" Type="integer" DefaultValue="20"/>
<Item Name="autoInject" Type="boolean" DefaultValue="false"/>
<Item Name="maximumSpeed" DefaultValue="10"/>
<Item Name="minimumSpeed" DefaultValue="1"/>
<Item Name="turnAngle" DefaultValue="0.18"/>
<Item Name="acceleration" DefaultValue="0.25"/>
<Item Name="sensorRange" DefaultValue="40"/>
<Item Name="collisionRange" DefaultValue="10"/>
</Parameters></Item>
<Item Name="Obstacle" Expanded="y">
<StructureDiagram>
<Variable ID="3" Name="y" Pos="40 70" NamePos="50 70">
<VarType ScalarType="real"/>
<Value><![CDATA[initY]]></Value>
<Equation/></Variable>
<Variable ID="2" Name="x" Pos="40 50" NamePos="50 50">
<VarType ScalarType="real"/>
<Value><![CDATA[initX]]></Value>
<Equation/></Variable>
<Bounds Flags="0" Pen="#808080 20" Brush="#000000" ID="1" Name="Obstacle" Rect="0 0 400 200" NamePos="10 10"/>
</StructureDiagram><Image/>
<Parameters>
<Item Name="dt" DefaultValue="1"/>
<Item Name="width" DefaultValue="20"/>
<Item Name="height" DefaultValue="20"/>
<Item Name="color" Type="Color" DefaultValue="Color.red"/>
<Item Name="initX" DefaultValue="uniform() * width"/>
<Item Name="initY" DefaultValue="uniform() * height"/>
</Parameters></Item>
</ActiveObjectClasses></Item>
</Packages></Item>
</Projects>
<Experiments>
<SimulationExperiments>
<Item Name="Simulation" FixedSeed="0" StopAtTime="0" Time="100" RootObject="flocks_of_agents.Flock" Current="1" RealTimeMode="1" RealTimeScale="30">
<Desktop xmlns:dt="urn:schemas-microsoft-com:datatypes" dt:dt="bin.base64">
AAAAAKwAAAABAAAAAQAAAKAAAAABAAAAAQAAAP//AAASAENYSk1ESU1vbm9DaGlsZFduZAAA
AAAAAAAAAQAAALsBAAD//wAADgBDQW5pbWF0aW9uVmlldwMAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAACwAAAACAAAAAwAAAP//////////+v///+f///9YAAAAWAAAAAwE
AACtAgAAAQAAAGQAAAAAAAAA</Desktop></Item>
</SimulationExperiments></Experiments>
<AnimatonSettings/>
<EditorDesktop xmlns:dt="urn:schemas-microsoft-com:datatypes" dt:dt="bin.base64">
AAAAANUDAAABAAAABAAAAOoAAAABAAAAAQAAAP//AAASAENYSk1ESU1vbm9DaGlsZFduZAAA
AAAAAAAAAQAAAIYBAAD//wAAFQBDU3RydWN0dXJlRGlhZ3JhbVZpZXcDAAAAMVxQcm9qZWN0
c1xGbG9ja3Mgb2YgQWdlbnRzXGZsb2Nrc19vZl9hZ2VudHNcQWdlbnQAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAALAAAAAAAAAADAAAA///////////6////5////24AAABuAAAA
MwEAABACAAADAAAAAABkAAAAQgUAAHwEAAAAAAAAAQAAAAAAAADuAAAAAQAAAAEAAAD//wAA
EgBDWEpNRElNb25vQ2hpbGRXbmQAAAAAAAAAAAEAAACGAQAA//8AABUAQ1N0cnVjdHVyZURp
YWdyYW1WaWV3AwAAADFcUHJvamVjdHNcRmxvY2tzIG9mIEFnZW50c1xmbG9ja3Nfb2ZfYWdl
bnRzXEZsb2NrAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACwAAAAAAAAAAwAAAP//
////////+v///+f///+EAAAAhAAAAFkBAAAdAgAAAwAAAAEABQAAAGQAAADCBAAAogQAAAAA
AAABAAAAAAAAAPEAAAABAAAAAQAAAP//AAASAENYSk1ESU1vbm9DaGlsZFduZAAAAAAAAAAA
AQAAAIYBAAD//wAAFQBDU3RydWN0dXJlRGlhZ3JhbVZpZXcDAAAANFxQcm9qZWN0c1xGbG9j
a3Mgb2YgQWdlbnRzXGZsb2Nrc19vZl9hZ2VudHNcT2JzdGFjbGUAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAALAAAAAAAAAADAAAA///////////6////5////5oAAACaAAAAbwEA
ADMCAAADAAAAAQADAAAAZAAAAPYEAACqBAAAAAAAAAEAAAAAAAAA9AAAAAEAAAABAAAA//8A
ABIAQ1hKTURJTW9ub0NoaWxkV25kAAAAAAAAAAABAAAAigEAAP//AAAVAENBbmltYXRpb25E
aWFncmFtVmlldwMAAAA7XFByb2plY3RzXEZsb2NrcyBvZiBBZ2VudHNcZmxvY2tzX29mX2Fn
ZW50c1xGbG9ja1xhbmltYXRpb24AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALAAA
AAIAAAADAAAA///////////6////5////7AAAACwAAAAhQEAAEkCAAADAAAAAQABAAAAZAAA
AIIEAADBAwAAAAAAAAAAAAA=</EditorDesktop>
<ControlBars>
<Editor PropertiesBarState="6"/>
<Viewer ProjectBarState="0" StencilsBarState="0"/></ControlBars>
</AnyLogicWorkspace>
